キーと値のデータをディスクに保存する
Key-Value のコレクションが比較的小さい場合
保存するには、shared_preferences
プラグイン。
通常は、
保存するためにネイティブ プラットフォーム統合を作成する必要があります。
iOS と Android の両方のデータ。幸運、
のshared_preferences
プラグインを使用して永続化できます
ディスク上のキーと値のデータ。共有設定プラグイン
ラップするNSUserDefaults
iOS とSharedPreferences
アンドロイドでは、
単純なデータの永続的なストアを提供します。
このレシピでは次の手順を使用します。
- 依存関係を追加します。
- データを保存します。
- データを読み取ります。
- データを削除します。
1.依存関係を追加します
開始する前に、shared_preferences
パッケージを依存関係として追加します。
追加するには、shared_preferences
パッケージを依存関係として、
走るflutter pub add
:
$ flutter pub add shared_preferences
2. データの保存
データを永続化するには、SharedPreferences
クラス。セッターメソッドは以下で利用可能です
などのさまざまなプリミティブ型setInt
、setBool
、 とsetString
。
Setter メソッドは 2 つのことを行います。まず、 メモリ内のキーと値のペア。次に、データをディスクに永続化します。
// obtain shared preferences
final prefs = await SharedPreferences.getInstance();
// set value
await prefs.setInt('counter', counter);
3. データの読み取り
データを読み取るには、SharedPreferences
クラス。各セッターには、対応するゲッターがあります。
たとえば、次のように使用できます。getInt
、getBool
、 とgetString
方法。
final prefs = await SharedPreferences.getInstance();
// Try reading data from the counter key. If it doesn't exist, return 0.
final counter = prefs.getInt('counter') ?? 0;
4. データを削除する
データを削除するには、remove()
方法。
final prefs = await SharedPreferences.getInstance();
await prefs.remove('counter');
サポートされているタイプ
Key-Value ストレージは使いやすく便利ですが、 それには制限があります:
- プリミティブ型のみを使用できます。
int
、double
、bool
、string
、 とstringList
。 - 大量のデータを保存するように設計されていません。
Android の共有設定の詳細については、 を参照してください共有設定ドキュメントAndroid 開発者の Web サイトで。
テストサポート
データを永続化するコードをテストすることをお勧めします。shared_preferences
。これをモックアウトすることでこれを行うことができますMethodChannel
によって使用されますshared_preferences
図書館。
人口を投入するSharedPreferences
テストの初期値を使用して
次のコードを実行して、setupAll()
のメソッド
テストファイル:
TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
.setMockMethodCallHandler(
const MethodChannel('plugins.flutter.io/shared_preferences'),
(methodCall) async {
if (methodCall.method == 'getAll') {
return <String, dynamic>{}; // set initial values here if desired
}
return null;
});
完全な例
import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({super.key});
// This widget is the root of the application.
@override
Widget build(BuildContext context) {
return const MaterialApp(
title: 'Shared preferences demo',
home: MyHomePage(title: 'Shared preferences demo'),
);
}
}
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
@override
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
@override
void initState() {
super.initState();
_loadCounter();
}
//Loading counter value on start
Future<void> _loadCounter() async {
final prefs = await SharedPreferences.getInstance();
setState(() {
_counter = (prefs.getInt('counter') ?? 0);
});
}
//Incrementing counter after click
Future<void> _incrementCounter() async {
final prefs = await SharedPreferences.getInstance();
setState(() {
_counter = (prefs.getInt('counter') ?? 0) + 1;
prefs.setInt('counter', _counter);
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Text(
'You have pushed the button this many times:',
),
Text(
'$_counter',
style: Theme.of(context).textTheme.headlineMedium,
),
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: _incrementCounter,
tooltip: 'Increment',
child: const Icon(Icons.add),
), // This trailing comma makes auto-formatting nicer for build methods.
);
}
}